Skip to content

Springback UV map#

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 120

from cut_predictor import ProjectionPredictor
doe = pd.read_csv('../data/doe.csv')
doe
doe_id Material_ID Blechdicke Niederhalterkraft Ziehspalt Stempel_ID Einlegeposition Ziehtiefe Breite UG OG E Material_Name Rp0 Rp0.2 Rp100 Rp25 Rp50
0 1 3 1.01 410 2.4 3 -5 30 70.2 1.71 2.00 191.37245 DC04_1.00mm 138.226960 147.601859 534.002871 377.443009 449.528189
1 2 5 1.48 400 2.4 3 -4 50 70.2 1.71 2.00 71.68198 AA5083_1.50mm 235.160326 237.951493 384.123147 369.820589 383.041834
2 3 1 1.00 210 2.4 3 -1 70 70.2 1.71 2.00 164.62254 DC01_1.00mm 133.182632 147.101263 517.275855 385.773439 447.384736
3 4 2 1.19 390 2.4 3 5 30 70.2 1.71 2.00 200.03813 DC01_1.20mm 160.714935 174.535075 564.455438 424.931018 490.442223
4 5 1 1.00 360 1.6 2 3 30 71.8 1.14 1.33 164.62254 DC01_1.00mm 133.182632 147.101263 517.275855 385.773439 447.384736
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
995 996 3 1.01 90 1.6 2 0 70 71.8 1.14 1.33 191.37245 DC04_1.00mm 138.226960 147.601859 534.002871 377.443009 449.528189
996 997 4 0.99 480 2.4 3 5 30 70.2 1.71 2.00 71.94184 AA5083_1.00mm 248.796491 251.315902 385.373316 371.774337 384.299873
997 998 5 1.48 490 2.4 3 3 50 70.2 1.71 2.00 71.68198 AA5083_1.50mm 235.160326 237.951493 384.123147 369.820589 383.041834
998 999 5 1.48 120 2.4 3 -3 30 70.2 1.71 2.00 71.68198 AA5083_1.50mm 235.160326 237.951493 384.123147 369.820589 383.041834
999 1000 5 1.48 150 2.4 3 -2 70 70.2 1.71 2.00 71.68198 AA5083_1.50mm 235.160326 237.951493 384.123147 369.820589 383.041834

1000 rows × 18 columns

data = pd.read_csv('../data/springback_uvmap.csv')
data.drop(data[data.doe_id == 1000].index, inplace=True)
data.drop(data[data.doe_id == 247].index, inplace=True)
data
doe_id u v x y z thickness epseqpl thinning
0 1 0.000000 0.000000 -132.603620 -117.544130 0.895656 1.000417 0.000823 0.990512
1 1 0.500000 0.019171 -0.000088 -87.060616 0.489975 0.991176 0.010210 0.981363
2 1 1.000000 0.036529 137.002380 -104.238950 0.742256 1.000619 0.001208 0.990712
3 1 1.000000 0.000000 132.603620 -117.544130 0.895656 1.000417 0.000823 0.990512
4 1 0.500000 0.000000 -0.000141 -95.070107 0.536487 0.992336 0.007779 0.982511
... ... ... ... ... ... ... ... ... ...
16721570 998 0.254233 0.654230 -89.967537 28.110500 35.537619 1.354696 0.277900 0.915335
16721571 998 0.255316 0.641760 -89.548157 28.170677 37.664772 1.345915 0.279300 0.909402
16721572 998 0.255497 0.628215 -89.451439 28.237469 39.968052 1.340451 0.279300 0.905710
16721573 998 0.254664 0.617541 -89.724800 28.299198 41.775429 1.393057 0.217900 0.941255
16721574 998 0.254648 0.605025 -89.672142 28.375393 43.917314 1.420526 0.182900 0.959815

16697652 rows × 9 columns

reg = ProjectionPredictor()
reg.load_data(
    doe = doe,
    data = data,
    index='doe_id',
    process_parameters = [
        'Blechdicke', 
        'Niederhalterkraft', 
        'Ziehspalt', 
        'Einlegeposition', 
        'Ziehtiefe',
        'Stempel_ID',
    ],
    categorical = [
        'Ziehspalt', 
        'Ziehtiefe',
        'Stempel_ID',
    ],
    position = ['u', 'v'],
    output = ['x', 'y', 'z'] #, 'thickness', 'epseqpl', 'thinning']
)
reg.data_summary()
Data summary
------------------------------------------------------------

Process parameters:
    - Blechdicke : numerical [ 0.99  ...  1.48 ]
    - Niederhalterkraft : numerical [ 10  ...  500 ]
    - Ziehspalt : categorical [1.6, 2.4]
    - Einlegeposition : numerical [ -5  ...  5 ]
    - Ziehtiefe : categorical [30, 50, 70]
    - Stempel_ID : categorical [2, 3]
Input variables:
    - u : numerical, [ 0.0 / 1.0 ] 
    - v : numerical, [ 0.0 / 1.0 ] 
Output variable(s):
    - x : numerical, [ -202.42731 / 202.42731 ]
    - y : numerical, [ -118.32256 / 96.918961 ]
    - z : numerical, [ 0.0 / 73.213165 ]

Inputs
------------------------------------------------------------

(16697652, 12)

Outputs
------------------------------------------------------------

(16697652, 3)

config = {
    'batch_size': 2048*16,
    'max_epochs': 50,
    'layers': [256, 256, 256, 256, 256],
    'dropout': 0.0,
    'learning_rate': 0.001,
    'activation': 'lrelu'
}

reg.custom_model(save_path='models/best_uv_model', config=config, verbose=True)
reg.training_summary()
Metal device set to: Apple M1 Pro

systemMemory: 16.00 GB
maxCacheSize: 5.33 GB

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 256)               3328      

 leaky_re_lu (LeakyReLU)     (None, 256)               0         

 dense_1 (Dense)             (None, 256)               65792     

 leaky_re_lu_1 (LeakyReLU)   (None, 256)               0         

 dense_2 (Dense)             (None, 256)               65792     

 leaky_re_lu_2 (LeakyReLU)   (None, 256)               0         

 dense_3 (Dense)             (None, 256)               65792     

 leaky_re_lu_3 (LeakyReLU)   (None, 256)               0         

 dense_4 (Dense)             (None, 256)               65792     

 leaky_re_lu_4 (LeakyReLU)   (None, 256)               0         

 dense_5 (Dense)             (None, 3)                 771       

=================================================================
Total params: 267,267
Trainable params: 267,267
Non-trainable params: 0
_________________________________________________________________
Epoch 1/50
459/459 [==============================] - 19s 38ms/step - loss: 0.0035 - val_loss: 8.9814e-05
Epoch 2/50
459/459 [==============================] - 17s 38ms/step - loss: 1.0140e-04 - val_loss: 6.3930e-05
Epoch 3/50
459/459 [==============================] - 17s 38ms/step - loss: 7.6886e-05 - val_loss: 5.2479e-05
Epoch 4/50
459/459 [==============================] - 17s 38ms/step - loss: 7.3999e-05 - val_loss: 3.5057e-05
Epoch 5/50
459/459 [==============================] - 17s 38ms/step - loss: 6.2850e-05 - val_loss: 3.0985e-05
Epoch 6/50
459/459 [==============================] - 17s 38ms/step - loss: 6.0826e-05 - val_loss: 2.8213e-05
Epoch 7/50
459/459 [==============================] - 17s 38ms/step - loss: 5.9249e-05 - val_loss: 2.5717e-05
Epoch 8/50
459/459 [==============================] - 17s 38ms/step - loss: 5.4855e-05 - val_loss: 2.3265e-05
Epoch 9/50
459/459 [==============================] - 18s 38ms/step - loss: 4.5766e-05 - val_loss: 2.9661e-05
Epoch 10/50
459/459 [==============================] - 17s 37ms/step - loss: 4.8833e-05 - val_loss: 4.2077e-05
Epoch 11/50
459/459 [==============================] - 17s 37ms/step - loss: 4.4549e-05 - val_loss: 5.3632e-05
Epoch 12/50
459/459 [==============================] - 17s 37ms/step - loss: 3.9942e-05 - val_loss: 1.8309e-05
Epoch 13/50
459/459 [==============================] - 17s 37ms/step - loss: 3.9184e-05 - val_loss: 8.9151e-05
Epoch 14/50
459/459 [==============================] - 18s 38ms/step - loss: 3.7175e-05 - val_loss: 1.9062e-05
Epoch 15/50
459/459 [==============================] - 17s 38ms/step - loss: 3.7786e-05 - val_loss: 1.7544e-05
Epoch 16/50
459/459 [==============================] - 17s 38ms/step - loss: 3.2921e-05 - val_loss: 3.6298e-05
Epoch 17/50
459/459 [==============================] - 17s 37ms/step - loss: 3.3376e-05 - val_loss: 1.4164e-05
Epoch 18/50
459/459 [==============================] - 18s 39ms/step - loss: 3.0455e-05 - val_loss: 1.6446e-05
Epoch 19/50
459/459 [==============================] - 17s 38ms/step - loss: 3.0066e-05 - val_loss: 1.4181e-05
Epoch 20/50
459/459 [==============================] - 17s 38ms/step - loss: 2.7863e-05 - val_loss: 1.9588e-05
Epoch 21/50
459/459 [==============================] - 18s 38ms/step - loss: 2.8360e-05 - val_loss: 1.1969e-05
Epoch 22/50
459/459 [==============================] - 17s 38ms/step - loss: 2.5683e-05 - val_loss: 1.4703e-05
Epoch 23/50
459/459 [==============================] - 17s 37ms/step - loss: 2.5767e-05 - val_loss: 1.9299e-05
Epoch 24/50
459/459 [==============================] - 17s 37ms/step - loss: 2.3532e-05 - val_loss: 1.0102e-05
Epoch 25/50
459/459 [==============================] - 17s 38ms/step - loss: 2.4355e-05 - val_loss: 2.8504e-05
Epoch 26/50
459/459 [==============================] - 17s 38ms/step - loss: 2.1764e-05 - val_loss: 1.4081e-05
Epoch 27/50
459/459 [==============================] - 17s 37ms/step - loss: 2.0814e-05 - val_loss: 6.4542e-05
Epoch 28/50
459/459 [==============================] - 17s 37ms/step - loss: 2.0557e-05 - val_loss: 1.4742e-05
Epoch 29/50
459/459 [==============================] - 17s 38ms/step - loss: 2.0759e-05 - val_loss: 1.0035e-05
Epoch 30/50
459/459 [==============================] - 17s 37ms/step - loss: 1.9063e-05 - val_loss: 7.1048e-05
Epoch 31/50
459/459 [==============================] - 18s 38ms/step - loss: 2.0484e-05 - val_loss: 3.2200e-05
Epoch 32/50
459/459 [==============================] - 17s 38ms/step - loss: 1.6852e-05 - val_loss: 1.1185e-05
Epoch 33/50
459/459 [==============================] - 17s 38ms/step - loss: 1.8098e-05 - val_loss: 1.0330e-05
Epoch 34/50
459/459 [==============================] - 17s 38ms/step - loss: 1.7150e-05 - val_loss: 1.1274e-05
Epoch 35/50
459/459 [==============================] - 17s 38ms/step - loss: 1.6459e-05 - val_loss: 1.1969e-05
Epoch 36/50
459/459 [==============================] - 17s 37ms/step - loss: 1.6292e-05 - val_loss: 1.6773e-05
Epoch 37/50
459/459 [==============================] - 17s 37ms/step - loss: 1.5983e-05 - val_loss: 1.8649e-05
Epoch 38/50
459/459 [==============================] - 17s 38ms/step - loss: 1.5137e-05 - val_loss: 1.4541e-05
Epoch 39/50
459/459 [==============================] - 17s 38ms/step - loss: 1.5048e-05 - val_loss: 9.4287e-06
Epoch 40/50
459/459 [==============================] - 17s 38ms/step - loss: 1.5887e-05 - val_loss: 1.5510e-05
Epoch 41/50
459/459 [==============================] - 17s 38ms/step - loss: 1.3647e-05 - val_loss: 1.0997e-05
Epoch 42/50
459/459 [==============================] - 17s 38ms/step - loss: 1.4484e-05 - val_loss: 1.0587e-05
Epoch 43/50
459/459 [==============================] - 17s 38ms/step - loss: 1.3647e-05 - val_loss: 9.5293e-06
Epoch 44/50
459/459 [==============================] - 18s 39ms/step - loss: 1.3482e-05 - val_loss: 1.0129e-05
Epoch 45/50
459/459 [==============================] - 17s 38ms/step - loss: 1.3360e-05 - val_loss: 8.8379e-06
Epoch 46/50
459/459 [==============================] - 17s 38ms/step - loss: 1.2514e-05 - val_loss: 8.2947e-06
Epoch 47/50
459/459 [==============================] - 17s 38ms/step - loss: 1.3042e-05 - val_loss: 8.0790e-06
Epoch 48/50
459/459 [==============================] - 17s 37ms/step - loss: 1.2872e-05 - val_loss: 3.8140e-05
Epoch 49/50
459/459 [==============================] - 17s 37ms/step - loss: 1.2358e-05 - val_loss: 8.3606e-06
Epoch 50/50
459/459 [==============================] - 17s 37ms/step - loss: 1.1781e-05 - val_loss: 1.0674e-05
INFO:tensorflow:Assets written to: models/best_uv_model/assets
Validation mse: 1.067442190105794e-05

reg.load_network('models/best_uv_model')
Metal device set to: Apple M1 Pro

idx = np.random.choice(data['doe_id'].unique()) 
print("Doe_ID", idx)
reg.compare(idx)
Doe_ID 439

x, y = reg.predict({
        'Blechdicke': 1.01, 
        'Niederhalterkraft': 410.0, 
        'Ziehspalt': 2.4, 
        'Einlegeposition': -5, 
        'Ziehtiefe': 30,
        'Stempel_ID': 3,
        'E': 191.37245,
        'Rp0': 138.22696,
        'Rp50': 449.528189,
    }, 
    shape=(500, 500))

import plotly
import plotly.graph_objs as go
plotly.offline.init_notebook_mode()

def show_surface(x, y):
    # Configure the trace.
    trace = go.Scatter3d(
        x=y[0, :, :].flatten(),  
        y=y[1, :, :].flatten(),
        z=y[2, :, :].flatten(),
        mode='markers',
        marker={
            'size': 0.2,
            'opacity': 0.8,
        }
    )

    # Configure the layout.
    layout = go.Layout(
        margin={'l': 0, 'r': 0, 'b': 0, 't': 0}
    )

    data = [trace]

    plot_figure = go.Figure(data=data, layout=layout)

    # Render the plot.
    plotly.offline.iplot(plot_figure)

show_surface(x, y)
reg.interactive(show_surface, shape=(500, 500))
interactive(children=(FloatSlider(value=1.1883700000000001, description='Blechdicke', max=1.48, min=0.99, step…